<?php
declare (strict_types = 1);
namespace app\admin\controller;

use think\Request;
use think\exception\ValidateException;
use service\JsonService as Json;
use think\facade\{View, Session};

use app\common\model\{SystemAdmin, SystemMenu, SystemRole};
use app\common\validate\{SystemAdminValidate, SystemRoleValidate, SystemMenuValidate};

class AuthController extends BaseController
{
    /**
     * 渲染管理员列表页面
     */
    public function admin_list()
    {   
        return view();
    }

    /**
     * 渲染管理员添加页面
     */
    public function admin_add()
    {
        $role = SystemRole::getList([], 0);
        if($role === false) $role = [];
        View::assign('menu', $role);
        return view();
    }

    /**
     * 渲染管理员编辑页面
     */
    public function admin_edit()
    {   
        $data = input('');

        $adminInfo = SystemAdmin::getFind(['id' => $data['id']]);

        View::assign('admin', $adminInfo);
        return view();
    }

    /**
     * 获取管理员列表数据
     */
    public function admin_data()
    {   
        $data = input('');

        try{
            validate(SystemAdminValidate::class)->scene('list')->check($data);
        }catch(ValidateException $e){
            return Json::fail($e->getError());
        }

        $where = [];

        if($data && isset($data['key'])){
            if(!empty($data['key']['account'])){
                $where[] = ['account', 'like', '%' . $data['key']['account'] . '%'];
            }
        }
        
        $field = 'id, account, role, status, last_time';
        $list = systemAdmin::getList($where, 1, $data['page'], $data['limit'], $field);

        if($list === false){
            return Json::fail('暂无数据~');
        }

        return Json::success('ok', $list, SystemAdmin::getNum($where));
    }

    /**
     * 管理员的启用||禁用
     */
    public function setStatus()
    {
        $data = input('');
        $status = SystemAdmin::setStatus($data['id']);

        return Json::success($status['msg']);
    }

    /**
     * 添加管理员
     */
    public function admin_add_data()
    {   
        $data = input('');

        try{
            validate(SystemAdminValidate::class)->scene('add')->check($data);
        }catch(ValidateException $e){
            return Json::fail($e->getError());
        }

        /** 查询待注册账号是否已存在 */
        $info = SystemAdmin::getFind(['account' => $data['account']], 'id');

        if($info !== false){
            return Json::fail('该账号已存在');
        }

        $data['password'] = setPass($data['password']);
        $flag = SystemAdmin::add($data);

        if($flag === false){
            return Json::fail('添加失败');
        }

        return Json::success('添加成功');
    }

    /**
     * 管理员信息修改
     */
    public function admin_edit_data()
    {
        $data = input('');

        try{
            validate(SystemAdminValidate::class)->scene('edit')->check($data);
        }catch(ValidateException $e){
            return Json::fail($e->getError());
        }

        $num = SystemAdmin::getNum(['account' => $data['account']]);

        if($num > 1){
            return Json::fail('该账号已存在');
        }

        if(empty($data['password'])){
            unset($data['password']);
        }else{
            $data['password'] = setPass($data['password']);
        }
        
        $flag = SystemAdmin::edit($data);

        if($flag === false) return Json::fail('修改失败');
        return Json::success('修改成功');
    }

    /**
     * 删除管理员
     */
    public function admin_del()
    {
        $data = input('');

        try{
            validate(SystemAdminValidate::class)->scene('show')->check($data);
        }catch(ValidateException $e){
            return Json::fail($e->getError());
        }

        $flag = SystemAdmin::destroy($data['id']);

        if(!$flag) return Json::fail('删除失败');
        return Json::success('删除成功');
    }





    /**
     * 渲染角色列表页面
     */
    public function role_list()
    {   
        return view();
    }

    /**
     * 渲染角色添加页面
     */
    public function role_add()
    {
        $menuList = SystemMenu::getList([['pid', '<>', 0]], 0);

        View::assign('menu', $menuList);
        return view();
    }

    /**
     * 渲染角色编辑页面
     */
    public function role_edit()
    {   
        $data = input('');

        $roleInfo = SystemRole::getFind(['id' => $data['id']]);

        if(!empty($roleInfo['rule'])){
            $roleInfo['menu_arr'] = explode(',', $roleInfo['rule']);
            $roleInfo = $roleInfo->toArray();
            array_pop($roleInfo['menu_arr']);
        }else{
            $roleInfo['menu_arr'] = [];
        }

        $menuList = SystemMenu::getList([['pid', '<>', 0]], 0);

        View::assign('role', $roleInfo);
        View::assign('menu_list', $menuList);
        return view();
    }

    /**
     * 获取角色列表数据
     */
    public function role_data()
    {   
        $data = input('');

        try{
            validate(SystemRoleValidate::class)->scene('list')->check($data);
        }catch(ValidateException $e){
            return Json::fail($e->getError());
        }

        $field = 'id, name, rule';
        $list = SystemRole::getList([], 1, $data['page'], $data['limit'], $field);

        if($list === false){
            return Json::fail('暂无数据~');
        }

        foreach($list as $k => $v){
            if(empty($v['rule'])){
                continue;
            }

            $menuArr = explode(',', $v['rule']);
            array_pop($menuArr);

            $menuStr = '';
            foreach($menuArr as $key){
                $menuStr .= SystemMenu::getVal(['id' => $key], 'name') . ',';
            }

            $list[$k]['rule'] = $menuStr;
        }

        return Json::success('ok', $list, SystemRole::getNum([]));
    }

    /**
     * 角色添加
     */
    public function role_add_data()
    {   
        $data = input('');

        try{
            validate(SystemRoleValidate::class)->scene('add')->check($data);
        }catch(ValidateException $e){
            return Json::fail($e->getError());
        }

        $flag = SystemRole::add($data);

        if($flag === false) return Json::fail('添加失败');
        return Json::success('添加成功');
    }

    /**
     * 角色信息修改
     */
    public function role_edit_data()
    {   
        $data = input('');

        try{
            validate(SystemRoleValidate::class)->scene('edit')->check($data);
        }catch(ValidateException $e){
            return Json::fail($e->getError());
        }
        
        $flag = SystemRole::edit($data);

        if($flag === false) return Json::fail('修改失败');
        return Json::success('修改成功');
    }

    /**
     * 删除角色
     */
    public function role_del()
    {
        $data = input('');

        try{
            validate(SystemRoleValidate::class)->scene('show')->check($data);
        }catch(ValidateException $e){
            return Json::fail($e->getError());
        }

        $flag = SystemRole::del(['id' => $data['id']]);

        if($flag === false) return Json::fail('删除失败');
        return Json::success('删除成功');
    }




    /**
     * 渲染权限列表页面
     */
    public function menu_list()
    {   
        return view();
    }

    /**
     * 渲染权限添加页面
     */
    public function menu_add()
    {
        View::assign('menu', SystemMenu::getList(['pid' => 0], 0));
        return view();
    }

    /**
     * 渲染图标页面
     */
    public function icon()
    {
        return view();
    }

    /**
     * 渲染权限编辑页面
     */
    public function menu_edit()
    {   
        $data = input('');

        $menuInfo = SystemMenu::getFind(['id' => $data['id']]);
        $menuList = SystemMenu::getList([['pid', '=', 0]]);

        View::assign('menu', $menuInfo);
        View::assign('menu_list', $menuList);
        return view();
    }

    /**
     * 获取权限列表
     */
    public function menu_data()
    {
        $data = input('');

        $where = [];

        if($data && isset($data['key'])){
            if(!empty($data['key']['name'])){
                $where[] = ['name', 'like', '%' . $data['key']['name'] . '%'];
            }
        }

        $field = ['id', 'icon', 'module', 'controller','action', 'name', 'sort', 'is_show'];
        $list = SystemMenu::getList($where, 1, $data['page'], $data['limit'], $field, 'sort DESC,id');

        if($list === false){
            return Json::fail('暂无数据~');
        }

        return Json::success('ok', $list, SystemMenu::getNum($where));
    }

    /**
     * 权限的显示||隐藏
     */
    public function setIsShow()
    {
        $data = input('');
        $status = SystemMenu::setIsShow($data['id']);

        return Json::success($status['msg']);
    }

    /**
     * 权限添加
     */
    public function menu_add_data()
    {
        $data = input('');

        try{
            validate(SystemMenuValidate::class)->scene('add')->check($data);
        }catch(ValidateException $e){
            return Json::fail($e->getError());
        }

        $flag = SystemMenu::add($data);

        if($flag === false) return Json::fail('添加失败');
        return Json::success('添加成功');
    }

    /**
     * 权限信息修改(单元格修改)
     */
    public function setMenuOnlyEdit()
    {   
        $data = input('');
        $editArr = ['id' => $data['id'], $data['field'] => $data['value']];
        
        $flag = SystemMenu::edit($editArr);

        if($flag === false) return Json::fail('修改失败');
        return Json::success('修改成功');
    }

    /**
     * 权限信息修改
     */
    public function menu_edit_data()
    {
        $data = input('');

        try{
            validate(SystemMenuValidate::class)->scene('edit')->check($data);
        }catch(ValidateException $e){
            return Json::fail($e->getError());
        }

        $flag = SystemMenu::edit($data);

        if($flag === false) return Json::fail('修改失败');
        return Json::success('修改成功');
    }

    /**
     * 删除权限
     */
    public function menu_del()
    {
        $data = input('');

        try{
            validate(SystemMenuValidate::class)->scene('show')->check($data);
        }catch(ValidateException $e){
            return Json::fail($e->getError());
        }

        $flag = SystemMenu::destroy($data['id']);

        if($flag === false) return Json::fail('删除失败');
        return Json::success('删除成功');
    }
}
